package managerBeanImpl;

import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import managerBean.ModPacchettoManagerBean;
import model.ComponentiPacchetti;
import model.ComponentiPacchettiPK;
import model.Elemento;
import model.Pacchetto;
import model.Volo;

@Stateless
public class ModPacchettoManagerBeanImpl implements ModPacchettoManagerBean {

	@PersistenceContext
    private EntityManager em;
	
	@Override
	public List cercaPacchettoInit(int idPacchetto,boolean crea) {
		Query query=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto="+idPacchetto);
		List<Pacchetto> pacchetti=query.getResultList();
		if(crea){
			Pacchetto pacchettoOld=pacchetti.get(0);
			Query query2=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto=(SELECT max(p1.idPacchetto) FROM Pacchetto p1)");
			List<Pacchetto> maxpacchetti=query2.getResultList();		
			int idNewPacchetto=maxpacchetti.get(0).getIdPacchetto()+1;
			if (idNewPacchetto<10000)
				idNewPacchetto=10000;
			Pacchetto pacchetto=new Pacchetto(idNewPacchetto,pacchettoOld.getDataPartenza(),pacchettoOld.getDataRitorno(),pacchettoOld.getNome(),pacchettoOld.getNumeroPersone(),pacchettoOld.getPrezzo());
			em.persist(pacchetto);
			Query query3=em.createQuery("SELECT c FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto);
			List<ComponentiPacchetti> componenti= query3.getResultList();
			for (int i=0;i<componenti.size();i++){
				ComponentiPacchetti comp=componenti.get(i);
				ComponentiPacchettiPK pk=comp.getId();
				ComponentiPacchettiPK pk2= new ComponentiPacchettiPK(idNewPacchetto,pk.getIdElemento());
				ComponentiPacchetti comp2= new ComponentiPacchetti(pk2,comp.getScelto());
				em.persist(comp2);		
			}
			Query query4=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto="+idNewPacchetto);
			pacchetti=query4.getResultList();
		}
		return pacchetti;
		
	
		
		
	}
	
	@Override
	public List getVoliPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}
	
	@Override
	public List getVoliAndataMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.scelto='OBBLIGATORIO' and c.id.idPacchetto="+idPacchetto);
		List<Volo> voliAndata=query.getResultList();
		Volo voloAndata=voliAndata.get(0);
		for (int i=0;i<voliAndata.size();i++){
			if(voliAndata.get(i).getData().before(voloAndata.getData()))
				voloAndata=voliAndata.get(i);
		}
		Query query2=em.createQuery("SELECT v FROM Volo v, Volo v2 WHERE v.luogoPartenza='"+voloAndata.getLuogoPartenza()+"' and v.luogoDestinazione='"+voloAndata.getLuogoDestinazione()+"' and v.data < v2.data and v2.id="+voloAndata.getId());
		return query2.getResultList();
	}
	
	@Override
	public List getVoliRitornoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.scelto='OBBLIGATORIO' and c.id.idPacchetto="+idPacchetto);
		List<Volo> voliRitorno=query.getResultList();
		Volo voloRitorno=voliRitorno.get(0);
		for (int i=0;i<voliRitorno.size();i++){
			if(voliRitorno.get(i).getData().after(voloRitorno.getData()))
				voloRitorno=voliRitorno.get(i);
		}
		Query query2=em.createQuery("SELECT v FROM Volo v, Volo v2 WHERE v.luogoPartenza='"+voloRitorno.getLuogoPartenza()+"' and v.luogoDestinazione='"+voloRitorno.getLuogoDestinazione()+"' and v.data > v2.data and v2.id="+voloRitorno.getId());
		return query2.getResultList();
	}
	
	@Override
	public List getVoliPacchettoCPMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT c FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	public List getHotelPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT h FROM Elemento e,ComponentiPacchetti c, Hotel h WHERE e.tipo='HOTEL' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=h.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}
	
	@Override
	public List getHotelPacchettoCPMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT c FROM Elemento e,ComponentiPacchetti c, Hotel h WHERE e.tipo='HOTEL' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=h.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	public List getEscursioniPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT x FROM Elemento e,ComponentiPacchetti c, Escursione x WHERE e.tipo='ESCURSIONE' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=x.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}
	
	@Override
	public List getEscursioniPacchettoCPMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT c FROM Elemento e,ComponentiPacchetti c, Escursione x WHERE e.tipo='ESCURSIONE' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=x.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	public void rimuoviHotelMgr(int idPacchetto, int idHotel) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='HOTEL' and e.idElementoSpecifico="+idHotel+")");
		query.executeUpdate();
	}

	@Override
	public void rimuoviVoloMgr(int idPacchetto, int idVolo) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.scelto <>'OBBLIGATORIO' and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+idVolo+")");
		query.executeUpdate();
	}

	@Override
	public void rimuoviEscursioneMgr(int idPacchetto, int idEscursione) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='ESCURSIONE' and e.idElementoSpecifico="+idEscursione+")");
		query.executeUpdate();
	}

	@Override
	public List visualizzaVoliMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT v FROM Volo v, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and v.data > p.dataPartenza and v.data < p.dataRitorno");
		return query.getResultList();
	}
	
	@Override
	public List cercaVoliMgr(int idPacchetto,String luogoPartenza) {
		Query query=em.createQuery("SELECT v FROM Volo v, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and v.luogoPartenza='"+luogoPartenza+"' and v.data > p.dataPartenza and v.data < p.dataRitorno");
		return query.getResultList();
	}

	@Override
	public void aggiungiVoloMgr(int idPacchetto, int idVolo, String scelto) {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElementoSpecifico="+idVolo+" and e.tipo='VOLO'");
		List<Elemento> elementi=query.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		ComponentiPacchettiPK pk=new ComponentiPacchettiPK(idPacchetto, idElemento);
		ComponentiPacchetti comp=new ComponentiPacchetti(pk, scelto);
		em.persist(comp);
	}
	
	@Override
	public List visualizzaHotelMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT h FROM Hotel h, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and h.data > p.dataPartenza and h.data < p.dataRitorno");
		return query.getResultList();
	}
	
	@Override
	public List cercaHotelMgr(int idPacchetto, String nome) {
		Query query=em.createQuery("SELECT h FROM Hotel h, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and h.nome='"+nome+"' and h.data > p.dataPartenza and h.data < p.dataRitorno");
		return query.getResultList();
	}

	@Override
	public void aggiungiHotelMgr(int idPacchetto, int idHotel, String scelto) {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElementoSpecifico="+idHotel+" and e.tipo='HOTEL'");
		List<Elemento> elementi=query.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		ComponentiPacchettiPK pk=new ComponentiPacchettiPK(idPacchetto, idElemento);
		ComponentiPacchetti comp=new ComponentiPacchetti(pk, scelto);
		em.persist(comp);
	}
	
	@Override
	public List visualizzaEscursioniMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT e FROM Escursione e, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and e.data > p.dataPartenza and e.data < p.dataRitorno");
		return query.getResultList();
	}
	
	@Override
	public List cercaEscursioniMgr(int idPacchetto,String indirizzo) {
		Query query=em.createQuery("SELECT e FROM Escursione e, Pacchetto p WHERE p.idPacchetto="+idPacchetto+" and e.indirizzo='"+indirizzo+"' and e.data > p.dataPartenza and e.data < p.dataRitorno");
		return query.getResultList();
	}

	@Override
	public void aggiungiEscursioneMgr(int idPacchetto, int idEscursione, String scelto) {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElementoSpecifico="+idEscursione+" and e.tipo='ESCURSIONE'");
		List<Elemento> elementi=query.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		ComponentiPacchettiPK pk=new ComponentiPacchettiPK(idPacchetto, idElemento);
		ComponentiPacchetti comp=new ComponentiPacchetti(pk, scelto);
		em.persist(comp);
	}

	@Override
	public void cambiaStatoVoloMgr(int idPacchetto, int idVolo) {
		Query query=em.createQuery("SELECT c FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+idVolo+")");
		List<ComponentiPacchetti> componenti= query.getResultList();
		if (!componenti.get(0).getScelto().equals("OBBLIGATORIO")){
			if (componenti.get(0).getScelto().equals("SCELTO")){
				this.rimuoviVoloMgr(idPacchetto, idVolo);
				this.aggiungiVoloMgr(idPacchetto, idVolo, "NONSCELTO");
			} else{
				this.rimuoviVoloMgr(idPacchetto, idVolo);
				this.aggiungiVoloMgr(idPacchetto, idVolo, "SCELTO");
			}
		}
		
	}
	
	@Override
	public void cambiaStatoHotelMgr(int idPacchetto, int idHotel) {
		Query query=em.createQuery("SELECT c FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='HOTEL' and e.idElementoSpecifico="+idHotel+")");
		List<ComponentiPacchetti> componenti= query.getResultList();
		if (componenti.get(0).getScelto().equals("SCELTO")){
			this.rimuoviHotelMgr(idPacchetto, idHotel);
			this.aggiungiHotelMgr(idPacchetto, idHotel, "NONSCELTO");
		} else{
			this.rimuoviHotelMgr(idPacchetto, idHotel);
			this.aggiungiHotelMgr(idPacchetto, idHotel, "SCELTO");
		}
		
	}
	
	@Override
	public void cambiaStatoEscursioneMgr(int idPacchetto, int idEscursione) {
		Query query=em.createQuery("SELECT c FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='ESCURSIONE' and e.idElementoSpecifico="+idEscursione+")");
		List<ComponentiPacchetti> componenti= query.getResultList();
		if (componenti.get(0).getScelto().equals("SCELTO")){
			
			this.rimuoviEscursioneMgr(idPacchetto, idEscursione);
			this.aggiungiEscursioneMgr(idPacchetto, idEscursione, "NONSCELTO");
		} else{
			this.rimuoviEscursioneMgr(idPacchetto, idEscursione);
			this.aggiungiEscursioneMgr(idPacchetto, idEscursione, "SCELTO");
		}
		
	}

	@Override
	public void updatePacchettoMgr(int idPacchetto, String nome,int numeroPersone) {
		Query query=em.createQuery("UPDATE Pacchetto p SET p.nome='"+nome+"',p.numeroPersone="+numeroPersone+" WHERE p.idPacchetto="+idPacchetto);
		query.executeUpdate();
	}

	@Override
	public void annullaPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto);
		query.executeUpdate();
		Query query2=em.createQuery("DELETE FROM Pacchetto p WHERE p.idPacchetto="+idPacchetto);
		query2.executeUpdate();
	}

	@Override
	public void sostituisciVoloAndataMgr(int idPacchetto, int idVolo) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.scelto='OBBLIGATORIO' and c.id.idPacchetto="+idPacchetto);
		List<Volo> voliAndata=query.getResultList();
		Volo voloAndata=voliAndata.get(0);
		for (int i=0;i<voliAndata.size();i++){
			if(voliAndata.get(i).getData().before(voloAndata.getData()))
				voloAndata=voliAndata.get(i);
		}
		Query query2=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.scelto = 'OBBLIGATORIO' and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+voloAndata.getId()+")");
		query2.executeUpdate();
		this.aggiungiVoloMgr(idPacchetto, idVolo, "OBBLIGATORIO");
		Query query3=em.createQuery("SELECT v FROM Volo v WHERE v.id="+idVolo);
		List<Volo> voli=query3.getResultList();
		Volo volo=voli.get(0);
		Query query4=em.createQuery("UPDATE Pacchetto p SET p.dataPartenza= :data WHERE p.idPacchetto="+idPacchetto);
		query4.setParameter("data", volo.getData());
		query4.executeUpdate();
	}
	
	public void sostituisciVoloRitornoMgr(int idPacchetto, int idVolo) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.scelto='OBBLIGATORIO' and c.id.idPacchetto="+idPacchetto);
		List<Volo> voliRitorno=query.getResultList();
		Volo voloRitorno=voliRitorno.get(0);
		for (int i=0;i<voliRitorno.size();i++){
			if(voliRitorno.get(i).getData().after(voloRitorno.getData()))
				voloRitorno=voliRitorno.get(i);
		}
		Query query2=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.scelto = 'OBBLIGATORIO' and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+voloRitorno.getId()+")");
		query2.executeUpdate();
		this.aggiungiVoloMgr(idPacchetto, idVolo, "OBBLIGATORIO");
		Query query3=em.createQuery("SELECT v FROM Volo v WHERE v.id="+idVolo);
		List<Volo> voli=query3.getResultList();
		Volo volo=voli.get(0);
		Query query4=em.createQuery("UPDATE Pacchetto p SET p.dataRitorno= :data WHERE p.idPacchetto="+idPacchetto);
		query4.setParameter("data", volo.getData());
		query4.executeUpdate();
		
	}
	

}
